/**
 * 表格数据导出 Composable
 *
 * 提供统一的表格数据导出功能，支持导出到 Excel 文件
 * 基于 ExcelJS 实现，支持自定义列配置和文件名
 */
import { ElMessage } from "element-plus";
import ExcelJS from "exceljs";

/**
 * 列配置接口
 */
export interface ExportColumnConfig {
  /** 列标题 */
  header: string;
  /** 数据字段名 */
  key: string;
  /** 列宽度（可选） */
  width?: number;
}

/**
 * 导出配置接口
 */
export interface ExportConfig {
  /** 文件名（不含扩展名） */
  filename?: string;
  /** 工作表名 */
  sheetName?: string;
  /** 列配置 */
  columns: ExportColumnConfig[];
  /** 表格数据 */
  data: Record<string, any>[];
}

/**
 * 表格数据导出 Composable
 */
export function useTableExport() {
  /**
   * 导出表格数据到 Excel 文件
   * @param config 导出配置
   */
  async function exportToExcel(config: ExportConfig) {
    try {
      const { filename = "export", sheetName = "Sheet1", columns, data } = config;

      // 创建工作簿
      const workbook = new ExcelJS.Workbook();
      const worksheet = workbook.addWorksheet(sheetName);

      // 设置列配置
      const excelColumns: Partial<ExcelJS.Column>[] = columns.map((col) => ({
        header: col.header,
        key: col.key,
        width: col.width || 15,
      }));

      worksheet.columns = excelColumns;

      // 添加数据行
      worksheet.addRows(data);

      // 设置表头样式
      const headerRow = worksheet.getRow(1);
      headerRow.font = { bold: true };
      headerRow.fill = {
        type: "pattern",
        pattern: "solid",
        fgColor: { argb: "FFE0E0E0" },
      };

      // 设置边框
      worksheet.eachRow((row, rowNumber) => {
        row.eachCell((cell) => {
          cell.border = {
            top: { style: "thin" },
            left: { style: "thin" },
            bottom: { style: "thin" },
            right: { style: "thin" },
          };
        });
      });

      // 生成文件并下载
      const buffer = await workbook.xlsx.writeBuffer();
      downloadFile(buffer, `${filename}.xlsx`);

      ElMessage.success(`导出成功：${filename}.xlsx`);
    } catch (error) {
      console.error("导出失败:", error);
      ElMessage.error("导出失败，请重试");
      throw error;
    }
  }

  /**
   * 下载文件
   * @param buffer 文件缓冲区
   * @param filename 文件名
   */
  function downloadFile(buffer: ArrayBuffer, filename: string) {
    const fileType =
      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
    const blob = new Blob([buffer], { type: fileType });
    const downloadUrl = window.URL.createObjectURL(blob);

    const downloadLink = document.createElement("a");
    downloadLink.href = downloadUrl;
    downloadLink.download = filename;

    document.body.appendChild(downloadLink);
    downloadLink.click();

    document.body.removeChild(downloadLink);
    window.URL.revokeObjectURL(downloadUrl);
  }

  /**
   * 从表格配置生成导出列配置
   * @param columns 表格列配置
   * @returns 导出列配置
   */
  function generateExportColumns(columns: any[]): ExportColumnConfig[] {
    return columns
      .filter((col) => {
        // 适配不同的列配置结构
        const hasKey = col.key || col.prop;
        const hasLabel = col.label;
        return hasKey && hasLabel;
      })
      .map((col) => ({
        header: col.label,
        key: col.key || col.prop, // 适配不同的 key 属性名
        width: col.width ? col.width / 8 : col.minWidth ? col.minWidth / 8 : 15, // 适配不同的宽度属性
      }));
  }

  return {
    exportToExcel,
    generateExportColumns,
  };
}
